{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (6) have mixed types. Specify dtype option on import or set low_memory=False.\n",
      "  interactivity=interactivity, compiler=compiler, result=result)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1001731 entries, 0 to 1001730\n",
      "Data columns (total 16 columns):\n",
      "cmte_id              1001731 non-null object\n",
      "cand_id              1001731 non-null object\n",
      "cand_nm              1001731 non-null object\n",
      "contbr_nm            1001731 non-null object\n",
      "contbr_city          1001712 non-null object\n",
      "contbr_st            1001727 non-null object\n",
      "contbr_zip           1001620 non-null object\n",
      "contbr_employer      988002 non-null object\n",
      "contbr_occupation    993301 non-null object\n",
      "contb_receipt_amt    1001731 non-null float64\n",
      "contb_receipt_dt     1001731 non-null object\n",
      "receipt_desc         14166 non-null object\n",
      "memo_cd              92482 non-null object\n",
      "memo_text            97770 non-null object\n",
      "form_tp              1001731 non-null object\n",
      "file_num             1001731 non-null int64\n",
      "dtypes: float64(1), int64(1), object(14)\n",
      "memory usage: 122.3+ MB\n"
     ]
    }
   ],
   "source": [
    "# 读入数据大小150M\n",
    "fec = pd.read_csv('./P00000001-ALL.csv')\n",
    "fec.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>cmte_id</th>\n",
       "      <th>cand_id</th>\n",
       "      <th>cand_nm</th>\n",
       "      <th>contbr_nm</th>\n",
       "      <th>contbr_city</th>\n",
       "      <th>contbr_st</th>\n",
       "      <th>contbr_zip</th>\n",
       "      <th>contbr_employer</th>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th>contb_receipt_dt</th>\n",
       "      <th>receipt_desc</th>\n",
       "      <th>memo_cd</th>\n",
       "      <th>memo_text</th>\n",
       "      <th>form_tp</th>\n",
       "      <th>file_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>HARVEY, WILLIAM</td>\n",
       "      <td>MOBILE</td>\n",
       "      <td>AL</td>\n",
       "      <td>3.6601e+08</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>20-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>HARVEY, WILLIAM</td>\n",
       "      <td>MOBILE</td>\n",
       "      <td>AL</td>\n",
       "      <td>3.6601e+08</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>50.0</td>\n",
       "      <td>23-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>SMITH, LANIER</td>\n",
       "      <td>LANETT</td>\n",
       "      <td>AL</td>\n",
       "      <td>3.68633e+08</td>\n",
       "      <td>INFORMATION REQUESTED</td>\n",
       "      <td>INFORMATION REQUESTED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>05-JUL-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>749073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>BLEVINS, DARONDA</td>\n",
       "      <td>PIGGOTT</td>\n",
       "      <td>AR</td>\n",
       "      <td>7.24548e+08</td>\n",
       "      <td>NONE</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>01-AUG-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>749073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>WARDENBURG, HAROLD</td>\n",
       "      <td>HOT SPRINGS NATION</td>\n",
       "      <td>AR</td>\n",
       "      <td>7.19016e+08</td>\n",
       "      <td>NONE</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>300.0</td>\n",
       "      <td>20-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     cmte_id    cand_id             cand_nm           contbr_nm  \\\n",
       "0  C00410118  P20002978  Bachmann, Michelle     HARVEY, WILLIAM   \n",
       "1  C00410118  P20002978  Bachmann, Michelle     HARVEY, WILLIAM   \n",
       "2  C00410118  P20002978  Bachmann, Michelle       SMITH, LANIER   \n",
       "3  C00410118  P20002978  Bachmann, Michelle    BLEVINS, DARONDA   \n",
       "4  C00410118  P20002978  Bachmann, Michelle  WARDENBURG, HAROLD   \n",
       "\n",
       "          contbr_city contbr_st   contbr_zip        contbr_employer  \\\n",
       "0              MOBILE        AL   3.6601e+08                RETIRED   \n",
       "1              MOBILE        AL   3.6601e+08                RETIRED   \n",
       "2              LANETT        AL  3.68633e+08  INFORMATION REQUESTED   \n",
       "3             PIGGOTT        AR  7.24548e+08                   NONE   \n",
       "4  HOT SPRINGS NATION        AR  7.19016e+08                   NONE   \n",
       "\n",
       "       contbr_occupation  contb_receipt_amt contb_receipt_dt receipt_desc  \\\n",
       "0                RETIRED              250.0        20-JUN-11          NaN   \n",
       "1                RETIRED               50.0        23-JUN-11          NaN   \n",
       "2  INFORMATION REQUESTED              250.0        05-JUL-11          NaN   \n",
       "3                RETIRED              250.0        01-AUG-11          NaN   \n",
       "4                RETIRED              300.0        20-JUN-11          NaN   \n",
       "\n",
       "  memo_cd memo_text form_tp  file_num  \n",
       "0     NaN       NaN   SA17A    736166  \n",
       "1     NaN       NaN   SA17A    736166  \n",
       "2     NaN       NaN   SA17A    749073  \n",
       "3     NaN       NaN   SA17A    749073  \n",
       "4     NaN       NaN   SA17A    736166  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cmte_id                          C00410118\n",
       "cand_id                          P20002978\n",
       "cand_nm                 Bachmann, Michelle\n",
       "contbr_nm                PRESTON, CLIFFORD\n",
       "contbr_city                     ORO VALLEY\n",
       "contbr_st                               AZ\n",
       "contbr_zip                     8.57379e+08\n",
       "contbr_employer      INFORMATION REQUESTED\n",
       "contbr_occupation    INFORMATION REQUESTED\n",
       "contb_receipt_amt                      250\n",
       "contb_receipt_dt                 21-JUN-11\n",
       "receipt_desc                           NaN\n",
       "memo_cd                                NaN\n",
       "memo_text                              NaN\n",
       "form_tp                              SA17A\n",
       "file_num                            736166\n",
       "Name: 12, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.iloc[12]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bachmann, Michelle', 'Romney, Mitt', 'Obama, Barack',\n",
       "       \"Roemer, Charles E. 'Buddy' III\", 'Pawlenty, Timothy',\n",
       "       'Johnson, Gary Earl', 'Paul, Ron', 'Santorum, Rick',\n",
       "       'Cain, Herman', 'Gingrich, Newt', 'McCotter, Thaddeus G',\n",
       "       'Huntsman, Jon', 'Perry, Rick'], dtype=object)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取全部候选人名单\n",
    "unique_cands = fec.cand_nm.unique()\n",
    "unique_cands"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 添加党派信息，使用字典\n",
    "parties = {'Bachmann, Michelle': 'Republican',\n",
    "           'Cain, Herman': 'Republican',\n",
    "           'Gingrich, Newt': 'Republican',\n",
    "           'Huntsman, Jon': 'Republican',\n",
    "           'McCotter, Thaddeus G': 'Republican',\n",
    "           'Obama, Barack': 'Democrat',\n",
    "           'Paul, Ron': 'Republican',\n",
    "           'Pawlenty, Timothy': 'Republican',\n",
    "           'Perry, Rick': 'Republican',\n",
    "           \"Roemer, Charles E. 'Buddy' III\": 'Republican',\n",
    "           'Romney, Mitt': 'Republican',\n",
    "           'Santorum, Rick': 'Republican',\n",
    "           'Johnson, Gary Earl': 'Republican'}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Obama, Barack\n",
       "123457    Obama, Barack\n",
       "123458    Obama, Barack\n",
       "123459    Obama, Barack\n",
       "123460    Obama, Barack\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Democrat\n",
       "123457    Democrat\n",
       "123458    Democrat\n",
       "123459    Democrat\n",
       "123460    Democrat\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461].map(parties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "fec['party'] = fec.cand_nm.map(parties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Democrat      593746\n",
       "Republican    407985\n",
       "Name: party, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec['party'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True     991475\n",
       "False     10256\n",
       "Name: contb_receipt_amt, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fec.contb_receipt_amt>0).value_counts() # 负的出资额为退款"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 只处理正的出资\n",
    "fec = fec[fec.contb_receipt_amt>0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Obama, Barack                     589127\n",
       "Paul, Ron                         143161\n",
       "Romney, Mitt                      105155\n",
       "Gingrich, Newt                     46883\n",
       "Santorum, Rick                     46245\n",
       "Cain, Herman                       20052\n",
       "Bachmann, Michelle                 13082\n",
       "Perry, Rick                        12709\n",
       "Roemer, Charles E. 'Buddy' III      5844\n",
       "Huntsman, Jon                       4066\n",
       "Pawlenty, Timothy                   3844\n",
       "Johnson, Gary Earl                  1234\n",
       "McCotter, Thaddeus G                  73\n",
       "Name: cand_nm, dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.value_counts(fec['cand_nm'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Obama和Romney是主要的两名候选人，创建针对这两人的赞助信息\n",
    "fec_mrbo = fec[fec.cand_nm.isin(['Obama, Barack', 'Romney, Mitt'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RETIRED                                   233990\n",
       "INFORMATION REQUESTED                      35107\n",
       "ATTORNEY                                   34286\n",
       "HOMEMAKER                                  29931\n",
       "PHYSICIAN                                  23432\n",
       "INFORMATION REQUESTED PER BEST EFFORTS     21138\n",
       "ENGINEER                                   14334\n",
       "TEACHER                                    13990\n",
       "CONSULTANT                                 13273\n",
       "PROFESSOR                                  12555\n",
       "NOT EMPLOYED                                9828\n",
       "SALES                                       8333\n",
       "LAWYER                                      8283\n",
       "MANAGER                                     8024\n",
       "PRESIDENT                                   7758\n",
       "STUDENT                                     7071\n",
       "OWNER                                       6343\n",
       "EXECUTIVE                                   5506\n",
       "SELF-EMPLOYED                               5472\n",
       "WRITER                                      5128\n",
       "Name: contbr_occupation, dtype: int64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据职业和雇主统计赞助信息\n",
    "fec.contbr_occupation.value_counts()[:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重复了一些职业信息，同时一些人没有提供\n",
    "occ_mapping = {\n",
    "    'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED',\n",
    "    'INFORMATION REQUESTED' : 'NOT PROVIDED',\n",
    "    'INFORMATION REQUESTED (BEST EFFORTS)' : 'NOT PROVIDED',\n",
    "    'C.E.O.': 'CEO'\n",
    "}\n",
    "\n",
    "f = lambda x: occ_mapping.get(x, x)\n",
    "fec.contbr_occupation = fec.contbr_occupation.map(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 同理，对雇主信息做同样处理\n",
    "emp_mapping = {\n",
    "    'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED',\n",
    "    'INFORMATION REQUESTED' : 'NOT PROVIDED',\n",
    "    'SELF' : 'SELF-EMPLOYED',\n",
    "    'SELF EMPLOYED' : 'SELF-EMPLOYED',\n",
    "}\n",
    "\n",
    "f = lambda x: emp_mapping.get(x, x)\n",
    "fec.contbr_employer = fec.contbr_employer.map(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "by_occuation = fec.pivot_table('contb_receipt_amt', \n",
    "                               index='contbr_occupation',\n",
    "                               columns='party',\n",
    "                               aggfunc='sum')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>party</th>\n",
       "      <th>Democrat</th>\n",
       "      <th>Republican</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>MIXED-MEDIA ARTIST / STORYTELLER</th>\n",
       "      <td>100.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AREA VICE PRESIDENT</th>\n",
       "      <td>250.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RESEARCH ASSOCIATE</th>\n",
       "      <td>100.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TEACHER</th>\n",
       "      <td>500.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>THERAPIST</th>\n",
       "      <td>3900.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "party                                Democrat  Republican\n",
       "contbr_occupation                                        \n",
       "   MIXED-MEDIA ARTIST / STORYTELLER     100.0         NaN\n",
       " AREA VICE PRESIDENT                    250.0         NaN\n",
       " RESEARCH ASSOCIATE                     100.0         NaN\n",
       " TEACHER                                500.0         NaN\n",
       " THERAPIST                             3900.0         NaN"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "by_occuation.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>party</th>\n",
       "      <th>Democrat</th>\n",
       "      <th>Republican</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>ATTORNEY</th>\n",
       "      <td>11141982.97</td>\n",
       "      <td>7.477194e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CEO</th>\n",
       "      <td>2074974.79</td>\n",
       "      <td>4.211041e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CONSULTANT</th>\n",
       "      <td>2459912.71</td>\n",
       "      <td>2.544725e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ENGINEER</th>\n",
       "      <td>951525.55</td>\n",
       "      <td>1.818374e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>EXECUTIVE</th>\n",
       "      <td>1355161.05</td>\n",
       "      <td>4.138850e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>HOMEMAKER</th>\n",
       "      <td>4248875.80</td>\n",
       "      <td>1.363428e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>INVESTOR</th>\n",
       "      <td>884133.00</td>\n",
       "      <td>2.431769e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LAWYER</th>\n",
       "      <td>3160478.87</td>\n",
       "      <td>3.912243e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MANAGER</th>\n",
       "      <td>762883.22</td>\n",
       "      <td>1.444532e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NOT PROVIDED</th>\n",
       "      <td>4866973.96</td>\n",
       "      <td>2.056547e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OWNER</th>\n",
       "      <td>1001567.36</td>\n",
       "      <td>2.408287e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PHYSICIAN</th>\n",
       "      <td>3735124.94</td>\n",
       "      <td>3.594320e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PRESIDENT</th>\n",
       "      <td>1878509.95</td>\n",
       "      <td>4.720924e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PROFESSOR</th>\n",
       "      <td>2165071.08</td>\n",
       "      <td>2.967027e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REAL ESTATE</th>\n",
       "      <td>528902.09</td>\n",
       "      <td>1.625902e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RETIRED</th>\n",
       "      <td>25305116.38</td>\n",
       "      <td>2.356124e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SELF-EMPLOYED</th>\n",
       "      <td>672393.40</td>\n",
       "      <td>1.640253e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "party                 Democrat    Republican\n",
       "contbr_occupation                           \n",
       "ATTORNEY           11141982.97  7.477194e+06\n",
       "CEO                 2074974.79  4.211041e+06\n",
       "CONSULTANT          2459912.71  2.544725e+06\n",
       "ENGINEER             951525.55  1.818374e+06\n",
       "EXECUTIVE           1355161.05  4.138850e+06\n",
       "HOMEMAKER           4248875.80  1.363428e+07\n",
       "INVESTOR             884133.00  2.431769e+06\n",
       "LAWYER              3160478.87  3.912243e+05\n",
       "MANAGER              762883.22  1.444532e+06\n",
       "NOT PROVIDED        4866973.96  2.056547e+07\n",
       "OWNER               1001567.36  2.408287e+06\n",
       "PHYSICIAN           3735124.94  3.594320e+06\n",
       "PRESIDENT           1878509.95  4.720924e+06\n",
       "PROFESSOR           2165071.08  2.967027e+05\n",
       "REAL ESTATE          528902.09  1.625902e+06\n",
       "RETIRED            25305116.38  2.356124e+07\n",
       "SELF-EMPLOYED        672393.40  1.640253e+06"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "over_2mm = by_occuation[by_occuation.sum(1)>2000000]\n",
    "over_2mm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f5bfe9588>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f583a86a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "over_2mm.plot(kind='barh')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对两位候选人出资额最高的职业和企业\n",
    "def get_top_amounts(group, key, n=5):\n",
    "    totals = group.groupby(key)['contb_receipt_amt'].sum()\n",
    "    return totals.nlargest(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_occupation                     \n",
       "Obama, Barack  RETIRED                                   25305116.38\n",
       "               ATTORNEY                                  11141982.97\n",
       "               INFORMATION REQUESTED                      4866973.96\n",
       "               HOMEMAKER                                  4248875.80\n",
       "               PHYSICIAN                                  3735124.94\n",
       "               LAWYER                                     3160478.87\n",
       "               CONSULTANT                                 2459912.71\n",
       "Romney, Mitt   RETIRED                                   11508473.59\n",
       "               INFORMATION REQUESTED PER BEST EFFORTS    11396894.84\n",
       "               HOMEMAKER                                  8147446.22\n",
       "               ATTORNEY                                   5364718.82\n",
       "               PRESIDENT                                  2491244.89\n",
       "               EXECUTIVE                                  2300947.03\n",
       "               C.E.O.                                     1968386.11\n",
       "Name: contb_receipt_amt, dtype: float64"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby('cand_nm')\n",
    "grouped.apply(get_top_amounts, 'contbr_occupation', n=7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_employer                       \n",
       "Obama, Barack  RETIRED                                   22694358.85\n",
       "               SELF-EMPLOYED                             17080985.96\n",
       "               NOT EMPLOYED                               8586308.70\n",
       "               INFORMATION REQUESTED                      5053480.37\n",
       "               HOMEMAKER                                  2605408.54\n",
       "Romney, Mitt   INFORMATION REQUESTED PER BEST EFFORTS    12059527.24\n",
       "               RETIRED                                   11506225.71\n",
       "               HOMEMAKER                                  8147196.22\n",
       "               SELF-EMPLOYED                              7409860.98\n",
       "               STUDENT                                     496490.94\n",
       "Name: contb_receipt_amt, dtype: float64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(get_top_amounts, 'contbr_employer')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "411           (10, 100]\n",
       "412         (100, 1000]\n",
       "413         (100, 1000]\n",
       "414           (10, 100]\n",
       "415           (10, 100]\n",
       "416           (10, 100]\n",
       "417         (100, 1000]\n",
       "418           (10, 100]\n",
       "419         (100, 1000]\n",
       "420           (10, 100]\n",
       "421           (10, 100]\n",
       "422         (100, 1000]\n",
       "423         (100, 1000]\n",
       "424         (100, 1000]\n",
       "425         (100, 1000]\n",
       "426         (100, 1000]\n",
       "427       (1000, 10000]\n",
       "428         (100, 1000]\n",
       "429         (100, 1000]\n",
       "430           (10, 100]\n",
       "431       (1000, 10000]\n",
       "432         (100, 1000]\n",
       "433         (100, 1000]\n",
       "434         (100, 1000]\n",
       "435         (100, 1000]\n",
       "436         (100, 1000]\n",
       "437           (10, 100]\n",
       "438         (100, 1000]\n",
       "439         (100, 1000]\n",
       "440           (10, 100]\n",
       "              ...      \n",
       "701356        (10, 100]\n",
       "701357          (1, 10]\n",
       "701358        (10, 100]\n",
       "701359        (10, 100]\n",
       "701360        (10, 100]\n",
       "701361        (10, 100]\n",
       "701362      (100, 1000]\n",
       "701363        (10, 100]\n",
       "701364        (10, 100]\n",
       "701365        (10, 100]\n",
       "701366        (10, 100]\n",
       "701367        (10, 100]\n",
       "701368      (100, 1000]\n",
       "701369        (10, 100]\n",
       "701370        (10, 100]\n",
       "701371        (10, 100]\n",
       "701372        (10, 100]\n",
       "701373        (10, 100]\n",
       "701374        (10, 100]\n",
       "701375        (10, 100]\n",
       "701376    (1000, 10000]\n",
       "701377        (10, 100]\n",
       "701378        (10, 100]\n",
       "701379      (100, 1000]\n",
       "701380    (1000, 10000]\n",
       "701381        (10, 100]\n",
       "701382      (100, 1000]\n",
       "701383          (1, 10]\n",
       "701384        (10, 100]\n",
       "701385      (100, 1000]\n",
       "Name: contb_receipt_amt, Length: 694282, dtype: category\n",
       "Categories (8, interval[int64]): [(0, 1] < (1, 10] < (10, 100] < (100, 1000] < (1000, 10000] < (10000, 100000] < (100000, 1000000] < (1000000, 10000000]]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对出资额分组\n",
    "bins = np.array([0, 1, 10, 100, 1000, 10000, \n",
    "                 100000, 1000000, 10000000])\n",
    "labels = pd.cut(fec_mrbo.contb_receipt_amt, bins)\n",
    "labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>493.0</td>\n",
       "      <td>77.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>40070.0</td>\n",
       "      <td>3681.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>372280.0</td>\n",
       "      <td>31853.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>153991.0</td>\n",
       "      <td>43357.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>22284.0</td>\n",
       "      <td>26186.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                       493.0          77.0\n",
       "(1, 10]                    40070.0        3681.0\n",
       "(10, 100]                 372280.0       31853.0\n",
       "(100, 1000]               153991.0       43357.0\n",
       "(1000, 10000]              22284.0       26186.0\n",
       "(10000, 100000]                2.0           1.0\n",
       "(100000, 1000000]              3.0           NaN\n",
       "(1000000, 10000000]            4.0           NaN"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby(['cand_nm', labels])\n",
    "grouped.size().unstack(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>0.805182</td>\n",
       "      <td>0.194818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>0.918767</td>\n",
       "      <td>0.081233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>0.910769</td>\n",
       "      <td>0.089231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>0.710176</td>\n",
       "      <td>0.289824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>0.447326</td>\n",
       "      <td>0.552674</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>0.823120</td>\n",
       "      <td>0.176880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                    0.805182      0.194818\n",
       "(1, 10]                   0.918767      0.081233\n",
       "(10, 100]                 0.910769      0.089231\n",
       "(100, 1000]               0.710176      0.289824\n",
       "(1000, 10000]             0.447326      0.552674\n",
       "(10000, 100000]           0.823120      0.176880\n",
       "(100000, 1000000]         1.000000           NaN\n",
       "(1000000, 10000000]       1.000000           NaN"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对上述结果进行绘图\n",
    "bucket_sums = grouped.contb_receipt_amt.sum().unstack(0)\n",
    "normed_sums = bucket_sums.div(bucket_sums.sum(axis=1), axis=0) # 求比例\n",
    "normed_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f5bb784a8>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f5bf8f2b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "normed_sums.plot(kind='barh')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>281840.15</td>\n",
       "      <td>86204.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>543123.48</td>\n",
       "      <td>527303.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>359247.28</td>\n",
       "      <td>105556.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>1506476.98</td>\n",
       "      <td>1888436.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>23824984.24</td>\n",
       "      <td>11237636.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CO</th>\n",
       "      <td>2132429.49</td>\n",
       "      <td>1506714.12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CT</th>\n",
       "      <td>2068291.26</td>\n",
       "      <td>3499475.45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DC</th>\n",
       "      <td>4373538.80</td>\n",
       "      <td>1025137.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DE</th>\n",
       "      <td>336669.14</td>\n",
       "      <td>82712.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FL</th>\n",
       "      <td>7318178.58</td>\n",
       "      <td>8338458.81</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK             281840.15      86204.24\n",
       "AL             543123.48     527303.51\n",
       "AR             359247.28     105556.00\n",
       "AZ            1506476.98    1888436.23\n",
       "CA           23824984.24   11237636.60\n",
       "CO            2132429.49    1506714.12\n",
       "CT            2068291.26    3499475.45\n",
       "DC            4373538.80    1025137.50\n",
       "DE             336669.14      82712.00\n",
       "FL            7318178.58    8338458.81"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据州统计i信息\n",
    "grouped = fec_mrbo.groupby(['cand_nm', 'contbr_st'])\n",
    "totals = grouped.contb_receipt_amt.sum().unstack(0).fillna(0)\n",
    "totals = totals[totals.sum(1)>100000]\n",
    "totals[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>0.765778</td>\n",
       "      <td>0.234222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>0.507390</td>\n",
       "      <td>0.492610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>0.772902</td>\n",
       "      <td>0.227098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>0.443745</td>\n",
       "      <td>0.556255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>0.679498</td>\n",
       "      <td>0.320502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CO</th>\n",
       "      <td>0.585970</td>\n",
       "      <td>0.414030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CT</th>\n",
       "      <td>0.371476</td>\n",
       "      <td>0.628524</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DC</th>\n",
       "      <td>0.810113</td>\n",
       "      <td>0.189887</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DE</th>\n",
       "      <td>0.802776</td>\n",
       "      <td>0.197224</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FL</th>\n",
       "      <td>0.467417</td>\n",
       "      <td>0.532583</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK              0.765778      0.234222\n",
       "AL              0.507390      0.492610\n",
       "AR              0.772902      0.227098\n",
       "AZ              0.443745      0.556255\n",
       "CA              0.679498      0.320502\n",
       "CO              0.585970      0.414030\n",
       "CT              0.371476      0.628524\n",
       "DC              0.810113      0.189887\n",
       "DE              0.802776      0.197224\n",
       "FL              0.467417      0.532583"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "percent = totals.div(totals.sum(1), axis=0)\n",
    "percent[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>281840.15</td>\n",
       "      <td>86204.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>543123.48</td>\n",
       "      <td>527303.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>359247.28</td>\n",
       "      <td>105556.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>1506476.98</td>\n",
       "      <td>1888436.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>23824984.24</td>\n",
       "      <td>11237636.60</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK             281840.15      86204.24\n",
       "AL             543123.48     527303.51\n",
       "AR             359247.28     105556.00\n",
       "AZ            1506476.98    1888436.23\n",
       "CA           23824984.24   11237636.60"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totals.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "contbr_st\n",
       "AK      368044.39\n",
       "AL     1070426.99\n",
       "AR      464803.28\n",
       "AZ     3394913.21\n",
       "CA    35062620.84\n",
       "dtype: float64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totals.sum(1)[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm\n",
       "Obama, Barack    1.355699e+08\n",
       "Romney, Mitt     8.817892e+07\n",
       "dtype: float64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "totals.sum(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
